package com.work.daily.stream;

import com.work.daily.stream.data.Person;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Stream 的收集(collect)
 * collect，收集，可以说是内容最繁多、功能最丰富的部分了。从字面上去理解，就是把一个流收集起来，
 * 最终可以是收集成一个值也可以收集成一个新的集合。
 *
 * @author Shengkang.Mo
 * @create 2020-11-27 15:41
 * <p>
 * 归集(toList/toSet/toMap)
 * 因为流不存储数据，那么在流中的数据完成处理后，需要将流中的数据重新归集到新的集合里。
 * toList、toSet和toMap比较常用，另外还有toCollection、toConcurrentMap等复杂一些的用法。
 */
public class Stream_7_1 {
    public static void main(String[] args) {

        //案例演示toList、toSet和toMap
        List<Integer> list = Arrays.asList(1, 6, 3, 4, 6, 7, 9, 6, 20);
        //收集偶数
        List<Integer> listNew = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
        System.out.println("toList after listNew=" + listNew);

        //收集偶数（去重）
        Set<Integer> set = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
        System.out.println("toSet after set=" + set);

        //收集员工工资大于8000的员工
        List<Person> personList = Person.initData();
        Map<String, Person> map = personList.stream().filter(p -> p.getSalary() > 8000).collect(Collectors.toMap(Person::getName, p -> p));
        System.out.println("toMap after map=" + map);
    }
}
